package br.com.salaodebeleza.view;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.inject.Inject;

import br.com.salaodebeleza.business.TbCalcularServicosBC;
import br.com.salaodebeleza.business.TbClienteBC;
import br.com.salaodebeleza.business.TbFuncionarioBC;
import br.com.salaodebeleza.business.TbServicosBC;
import br.com.salaodebeleza.domain.TbCalcularServicos;
import br.com.salaodebeleza.domain.TbCliente;
import br.com.salaodebeleza.domain.TbFuncionario;
import br.com.salaodebeleza.domain.TbServicos;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./tbCalcularServico.jsf")
public class TbCalcularServicoMB extends AbstractEditPageBean<TbCalcularServicos, Long> {

	private static final long serialVersionUID = 1L;
	
	@Inject
	private FacesContext facesContext;
	
	@Inject
	private TbClienteBC tbClienteBC;
	
	@Inject
	private TbServicosBC tbServicoBC;
	
	@Inject
	private TbFuncionarioBC tbFuncionarioBC;
	
	@Inject
	private TbCalcularServicosBC tbCalcularServicosBC;
	
	private Double vlTotal = 0.0;
	private TbCliente clienteSelecionado;
	private TbServicos servicoSelecionado;
	private TbFuncionario funcionarioSelecionado;
	private TbCalcularServicos calcularServicos;
	
	private List<TbCalcularServicos> listaCalcularServicos = new LinkedList<TbCalcularServicos>(); 
	private List<TbServicos> listaServicos = new LinkedList<TbServicos>();
	private List<TbFuncionario> listaFuncionarios = new LinkedList<TbFuncionario>();
	
	private List<SelectItem> tbClientes = new LinkedList<SelectItem>();
	private List<SelectItem> tbServicos = new LinkedList<SelectItem>();
	private List<SelectItem> tbFuncionarios = new LinkedList<SelectItem>();

	public List<SelectItem> getTbClientes() {

		tbClientes.clear();
		
		for(TbCliente t : tbClienteBC.findAll()){
			tbClientes.add(new SelectItem(t, t.getNmCliente()));
		}
		return tbClientes;
	}
	
	public List<SelectItem> getTbServicos() {

		tbServicos.clear();
		
		for(TbServicos t : tbServicoBC.findAll()){
			tbServicos.add(new SelectItem(t, t.getNmServico()));
		}
		return tbServicos;
	}
	
	public List<SelectItem> getTbFuncionarios() {

		tbFuncionarios.clear();
		
		for(TbFuncionario t : tbFuncionarioBC.findAll()){
			tbFuncionarios.add(new SelectItem(t, t.getNmFuncionario()));
		}
		return tbFuncionarios;
	}
	
	public List<TbServicos> getListaServicos(){
		return listaServicos;
	}
	
	public Date getPegaDataAtual() {  
        Calendar calendar = new GregorianCalendar();  
        Date date = new Date();  
        calendar.setTime(date);  
        return calendar.getTime();  
    }  
	
	public void addServicoLista() {

		calcularServicos = new TbCalcularServicos();
		calcularServicos.setDtAgendamento(getPegaDataAtual());
		calcularServicos.setTbCliente(clienteSelecionado);
		calcularServicos.setTbServico(servicoSelecionado);
		calcularServicos.setTbFuncionario(funcionarioSelecionado);
		
		listaCalcularServicos.add(calcularServicos);
		this.vlTotal += this.servicoSelecionado.getVlServico();
	
	}
	
	public void removeServicoLista(TbCalcularServicos item) {

		this.vlTotal -= item.getTbServico().getVlServico();
		listaCalcularServicos.remove(item);
	}
	
	@Override
	@Transactional
	public String insert() {
		try {
			
			for (TbCalcularServicos servico : listaCalcularServicos) {
				
				this.tbCalcularServicosBC.insert(servico);
				
			}
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Operacao Realizada com Sucesso!", "");
			facesContext.addMessage(null, message);
		} catch (Exception e) {
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Realizar Operacao! \nEntre em contato o Administrador do Sistema.", "");
			facesContext.addMessage(null, message);
		}
		return getPreviousView();
	}
	
	@Override
	public String delete() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String update() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected void handleLoad() {
		setBean(this.tbCalcularServicosBC.load(getId()));
		
	}
	
	protected List<TbCalcularServicos> handleResultList() {
		return this.tbCalcularServicosBC.findAll();
	}

	public Double getVlTotal() {
		return vlTotal;
	}

	public void setVlTotal(Double vlTotal) {
		this.vlTotal = vlTotal;
	}

	public TbCliente getClienteSelecionado() {
		return clienteSelecionado;
	}

	public void setClienteSelecionado(TbCliente clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}
	
	public TbServicos getServicoSelecionado() {
		return servicoSelecionado;
	}

	public void setServicoSelecionado(TbServicos servicoSelecionado) {
		this.servicoSelecionado = servicoSelecionado;
	}

	public TbFuncionarioBC getTbFuncionarioBC() {
		return tbFuncionarioBC;
	}

	public void setTbFuncionarioBC(TbFuncionarioBC tbFuncionarioBC) {
		this.tbFuncionarioBC = tbFuncionarioBC;
	}

	public TbFuncionario getFuncionarioSelecionado() {
		return funcionarioSelecionado;
	}

	public void setFuncionarioSelecionado(TbFuncionario funcionarioSelecionado) {
		this.funcionarioSelecionado = funcionarioSelecionado;
	}

	public List<TbFuncionario> getListaFuncionarios() {
		return listaFuncionarios;
	}

	public void setListaFuncionarios(List<TbFuncionario> listaFuncionarios) {
		this.listaFuncionarios = listaFuncionarios;
	}

	public void setTbFuncionarios(List<SelectItem> tbFuncionarios) {
		this.tbFuncionarios = tbFuncionarios;
	}

	public List<TbCalcularServicos> getListaCalcularServicos() {
		return listaCalcularServicos;
	}

	public void setListaCalcularServicos(List<TbCalcularServicos> listaCalcularServicos) {
		this.listaCalcularServicos = listaCalcularServicos;
	}
	

}